package design._02_singleton.IoDH3;
/* 完美的解决方案
 * 内部类在 调用时 或 其成员被调用时 才会被加载，此时才会加载静态属性。
 * 
 * 只有调用了getInstance()方法时，内部类菜被加载，也就是内部类的静态属性才被初始化。
 * 因为此类没有synchronized/volatile，所有才是最总解决方法
 * 
 * 饿汉式单例类不能实现延迟加载，不管将来用不用始终占据内存；
 * 懒汉式单例类线程安全控制烦琐，而且性能受影响。
 * 最终解决方法(IoDH)：
 * 通过使用IoDH，我们既可以实现延迟加载，又可以保证线程安全
 */
public class Singleton {
		
	private Singleton() {
	}
	//java类是在第一次使用时才会加载，无论他是否时内部类或静态类。
	private static class HolderClass {
		private final static Singleton instance = new Singleton();
	}
	
	public static Singleton getInstance() {
		return HolderClass.instance;
	}
	public static void main(String args[]) {
		Singleton s1, s2;
		s1 = Singleton.getInstance();
		s2 = Singleton.getInstance();
		System.out.println(s1==s2);
	}
}
